package dataStructure.linkedList.Recurrence;

import java.util.zip.ZipEntry;

/**
 * @Description: 汉诺塔问题
 * @Date: 2020/4/8
 * @Author: 许群星
 */
public class Hanoi {
    public static void main(String[] args) {
        hanoi(3,'X','Y','Z');

    }
    public static void hanoi(int n,char from,char temp,char to){
        if (n>0){
            hanoi(n-1,from,to,temp);
            System.out.println("take"+n+"from"+from+"to"+to);
            hanoi(n-1,temp,from,to);
        }

    }
}
/*
超经典了的递归解决问题了：

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说：在世界中心贝拿勒斯（在印度北部）的圣庙里，一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候，在其中一根针上从下到上地穿好了由大到小的64片金片，这就是所谓的汉诺塔。不论白天黑夜，总有一个僧侣在按照下面的法则移动这些金片：一次只移动一片，不管在哪根针上，小片必须在大片上面。僧侣们预言，当所有的金片都从梵天穿好的那根针上移到另外一根针上时，世界就将在一声霹雳中消灭，而梵塔、庙宇和众生也都将同归于尽。

数学描述就是：

有三根杆子X，Y，Z。X杆上有N个(N>1)穿孔圆盘，盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至Y杆：
1. 每次只能移动一个圆盘；
2. 大盘不能叠在小盘上面。

递归思想：
1. 将X杆上的n-1个圆盘都移到空闲的Z杆上，并且满足上面的所有条件
2. 将X杆上的第n个圆盘移到Y上
3. 剩下问题就是将Z杆上的n-1个圆盘移动到Y上了

公式描述有点麻烦，用语言描述下吧：
1. 以Y杆为中介，将前n-1个圆盘从X杆挪到Z杆上(本身就是一个n-1的汉诺塔问题了！)
2. 将第n个圆盘移动到Y杆上
3. 以X杆为中介，将Z杆上的n-1个圆盘移到Y杆上(本身就是一个n-1的汉诺塔问题了！)
————————————————
版权声明：本文为CSDN博主「乌枭」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/qq_34039315/java/article/details/78679029
 */